//! Pomocne funkcije ...

#include "razno.h"

//! operacije s memorijom (preuzeto...)

/*!
 * Popuni blok memorije po bajtovima (8 bita).
 * \param s Blok
 * \param c Vrijednost (samo niskih 8 bita se uzima u obzir)
 * \param n Koliko bajtova treba ispuniti
 * \returns s
 */
void *memset (void *s, int c, size_t n)
{
	size_t p;
	char *m = (char*)s;
	for (p = 0; p < n; ++p, ++m)
		*m = (char)c;
	return s;
}

/*!
 * Popuni blok memorije po word-ovima (16 bita).
 * \param s Blok
 * \param c Vrijednost (samo niskih 16 bita se uzima u obzir)
 * \param n Koliko wordova treba ispuniti
 * \returns s
 */
void *memsetw (void *s, int c, size_t n)
{
	size_t p;
	short *m = (short*)s;
	for (p = 0; p < n; ++p, ++m)
		*m = (short)c;
	return s;
}

/*!
 * Kopira blok memorije po bajtovima (8 bita).
 * \param dest Odrediste
 * \param src Izvor
 * \param n Koliko bajtova treba kopirati
 * \returns dest
 */
void *memcpy (void *dest, const void *src, size_t n)
{
	char *d = (char*)dest, *s = (char*)src;
	size_t p;
	for (p = 0; p < n; ++p, ++d, ++s)
		*d = *s;
	return dest;
}

/*!
 * Pomakne blok memorije po bajtovima (8 bita).
 * \param dest Odrediste
 * \param src Izvor
 * \param n Koliko bajtova treba pomaknuti
 * \returns dest
 */
void *memmove (void *dest, const void *src, size_t n)
{
	char *d, *s;
	size_t p;
	if (dest < src) {
		d = (char*)dest;
		s = (char*)src;
		for (p = 0; p < n; ++p, ++d, ++s)
			*d = *s;
	} else {
		d = ((char*)dest) + n - 1;
		s = ((char*)src) + n - 1;
		for (p = 0; p < n; ++p, --d, --s)
			*d = *s;
	}
	return dest;
}

/*!
 * Pomakne blok memorije po wordovima (16 bita).
 * \param dest Odrediste
 * \param src Izvor
 * \param n Koliko wordova treba pomaknuti
 * \returns dest
 */
void *memmovew (void *dest, const void *src, size_t n)
{
	short int *d, *s;
	size_t p;
	if (dest < src) {
		d = (short int*)dest;
		s = (short int*)src;
		for (p = 0; p < n; ++p, ++d, ++s)
			*d = *s;
	} else {
		d = ((short int*)dest) + n - 1;
		s = ((short int*)src) + n - 1;
		for (p = 0; p < n; ++p, --d, --s)
			*d = *s;
	}
	return dest;
}

/*!
 * Usporedi blokove memorije po bajtovima (8 bita).
 * \param m1 Prvi blok
 * \param m2 Drugi blok
 * \param size Koliko bajtova treba usporediti
 * \returns -1 ako je prvi manji, 0 ako su isti, 1 ako je prvi veci
 */
int memcmp (const void *m1, const void *m2, size_t size)
{
	unsigned char *a = (unsigned char *)m1;
	unsigned char *b = (unsigned char *)m2;
	for (; size--; ++a, ++b) {
		if (*a < *b) return -1;
		else if (*a > *b) return 1;
	}
	return 0;
}
